package com.rpc.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @Description 解码器
 * @Author 顾志杰
 * @Date 2022/3/2 10:55
 */
public class RpcDcoder extends ByteToMessageDecoder {

  private Class<?> genericClass;

  public RpcDcoder(Class<?> genericClass) {
    this.genericClass = genericClass;
  }

  @Override
  protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
    /*因为编码的时候包头必然有4个字节  如果小于4证明数据没有传完丢包了  直接返回*/
    if (in.readableBytes() < 4) {
      return;
    }

    /*首先记录一下当前的位置*/
    in.markReaderIndex();
    /*当前请求的数据包的大小读取出来*/
    int dataLength = in.readInt();
    /*如果读取出来的数据字节数小于实际传输的的字节数就重置一下*/
    if(in.readableBytes() < dataLength){
      in.resetReaderIndex();
      return;
    }
    /*真正读取需要长度的数据包内容*/
    byte[] data = new byte[dataLength];
    in.readBytes(data);
    /*解码操作 返回指定对象*/
    Object obj = Serialization.deserialize(data, genericClass);
    /*填充到buffer中，传播到下游handler做实际的处理*/
    out.add(obj);
  }
}
